#ifndef BGV_TESTSCHEME_H_
#define BGV_TESTSCHEME_H_

#include <iostream>
#include "test_scheme_key_gen.h"

using namespace std;

class TestScheme {
public:
    TestScheme(const TestScheme &other) = delete;
    TestScheme &operator = (const TestScheme &other) = delete;
    TestScheme(TestScheme &&other) = delete;
    TestScheme &operator = (TestScheme &&other) = delete;
    static void TestEncodeEncryptDecryptDecode(long logN, long L, long K, long T, long logSlots);
    static void TestEncodeEncryptDecryptDecode(long logN, long L, long K, long T, long logSlots, int NUM_ITERATIONS);
    static void TestMulCtCtWithReli(long logN, long L, long K, long T, long logSlots);
    static void TestMulCtCtWithReli(long logN, long L, long K, long T, long logSlots, int NUM_ITERATIONS);
    static void TestMultCtPt(long logN, long L, long K, long T, long logSlots);
    static void TestMultCtPt(long logN, long L, long K, long T, long logSlots, int NUM_ITERATIONS);
    static void TestMultRepeat(long logN, long L, long K, long T, long logSlots);
    static void TestAddCtCt(long logN, long L, long K, long T, long logSlots);
    static void TestAddCtCt(long logN, long L, long K, long T, long logSlots, int NUM_ITERATIONS);
    static void TestAddCtPt(long logN, long L, long K, long T, long logSlots);
    static void TestAddCtPt(long logN, long L, long K, long T, long logSlots, int NUM_ITERATIONS);
    static void TestRotateBatch(long logN, long L, long K, long T, long rotSlots, long logSlots, bool isLeft);
    static void TestRotateBatch(long logN, long L, long K, long T, long rotSlots, long logSlots, bool isLeft, int NUM_ITERATIONS);
    static void TestRotateColumn(long logN, long L, long K, long T, long logSlots);
    static void TestRotateColumn(long logN, long L, long K, long T, long logSlots, int NUM_ITERATIONS);
    static void TestKeyGeneration(long logN, long L, long K, long T, long logSlots);
    static void TestSecretKeyGeneration(long logN, long L, long K, long T, long logSlots, int NUM_ITERATIONS);
    static void TestRotateKeyGeneration(long logN, long L, long K, long T, long logSlots, int NUM_ITERATIONS);
    static void TestEncryptBySecretKey(long logN, long L, long K, long T, long logSlots);
    static void TestEncryptBySecretKey(long logN, long L, long K, long T, long logSlots, int NUM_ITERATIONS);
    static void TestPublicKeyGen(long logN, long L, long K, long T, long logSlots, int NUM_ITERATIONS);
    static void TestSwitchKeyGen(long logN, long L, long K, long T, long logSlots, int NUM_ITERATIONS);
};

#endif /* TESTSCHEME_H_ */
